[小ネタ]ECS ExecのenableExecuteCommandを有効にしようとするとエラーになってしまう

[小ネタ]ECS ExecのenableExecuteCommandを有効にしようとするとエラーになってしまう

ECS ExecのenableExecuteCommandを有効にする場合は、SSMセッションマネージャのIAMポリシーをタスクロールにアタッチする必要があります!タスク実行ロールにアタッチしないよう気をつけましょう!!
Clock Icon2021.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

弊社の以下ブログを参考にECS Execの設定をしていたところ、ECSサービスのenableExecuteCommand有効にする設定でエラーとなりハマってしまいました。

今回はエラー原因と解決方法をまとめていきます。

まずは結論

ECSタスクロールのSSMセッションマネージャー関連の権限不足が原因でした。

環境

今回実行した環境は以下の通りです。

  • macOS Big Sur 11.6
  • AWS CLI 2.2.35
  • Fargateプラットフォーム 1.4.0

エラー事象

ECSサービスのenableExecuteCommand有効にするため、以下のコマンドを実行しました。

$ aws ecs update-service \
    --cluster [クラスター名] \
    --service [サービスー名] \
    --enable-execute-command

すると、以下のようなエラーメッセージが返ってきました。

An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.

原因

以下のSSMセッションマネージャ用IAMポリシーを作成したのですが、アタッチ先をECSタスク実行ロールにしたのが原因です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    }
  ]
}

最初の結論で記載した通り、上記IAMポリシーはECSタスクロールにアタッチしなくてはなりません。

ロールの違いについて

ECSのタスク実行ロールとタスクロールは別物です。

タスク実行ロールはECSコンテナエージェントがECRからのコンテナイメージプルや、コンテナログをCloudWatchに送信するためIAMポリシーが必要となります。
AWSマネージメントコンソールから作成した場合は、以下のデフォルトIAMポリシーが作成されます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}


一方タスクロールコンテナが他のAWSサービスと連携する際にのみ、必要なIAMポリシーを設定します。

詳細については、Toriさんの以下ツイートがわかりやすかったです。

ECS と IAM の話です

1. Task role

アプリに IAM 権限が必要なときに設定するもの (例: アプリから S3 触りたい、DDB 触りたい)

2. Task "execution" role

ECS Agent のようなコンテナ実行環境のエージェントが必要とする IAM 権限を設定するもの (例: ECR からイメージ pull、CWLogs にログ送る) pic.twitter.com/QZs8AG974i

— Tori Hara (@toricls) August 19, 2021

ところで何でこんなミスしたの

ECSのIAMロールの違いがよくわかっておらず、タスク実行ロールに必要なIAMポリシーがアタッチされてればイケるかなーと思ったら見事にハマりました…
横着は良く無いですね。

まとめ

Toriさんの解説ツイートは以前にも見たことがあったのですが、実際に利用する(ハマる)ことでちゃんと理解できました。
やはり実際に手を動かすことは大事です。

この記事が、どなたかのお役に立てば幸いです。それでは!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.